iT邦幫忙

0

[Compiler 筆記 (3)]:如何使用 gdb 追 chibicc 的程式碼

  • 分享至 

  • xImage
  •  

以前曾經學過幾次 gdb,但後來卻會一直覺得這個東西很難用也不知道怎麼用比較好,直到最近在讀 chibicc 時,剛好就有了使用 gdb 的需求,有了這個需求後,覺得用起 gdb 就比較有學習的方向,以下來紀錄我是如何使用 gdb 來 debug chibicc。

  1. 下載 chibicc
git clone https://github.com/rui314/chibicc
cd chibicc/
  1. 編譯 chibicc
make

編譯好之後應該會出現 chibicc 這個檔案

  1. 然後準備一個讓 chibicc 做編譯的簡單檔案 foo.c
// foo.c
int foo()
{
    int i;
    int j;
    i = 3;
    if (i > 0) {
        j = 2;
    }
    return 2;
}
  1. 接著可以就可以用 gdb 來 debug chibicc 了
gdb --args ./chibicc -c foo.c # 加上 --args 代表 ./chibicc 之後還有參數
  1. 強烈建議進入 gdb 之後,輸入
tui enable

會出現當前在哪一行程式碼的介面,這個功能可以讓你的生活輕鬆許多。

  1. 可以正式開始 debug 了,我認為剛開始只需要知道以下幾個指令就好,有不記得的會搭配 GDB cheatsheet 這個小抄來使用
# b <function name>         b 代表 break(中斷點)程式執行時會停在這裡,如
(gdb) b parse                   # 可以讓程式執行時停在 parse.c 裡的 parse() 這個 function
(gdb) r                         # 代表 run,從頭開始執行的意思
(gdb) n                         # 代表 next,執行下一行程式碼的意思
(gdb) s                         # 代表 step,遇到 function call 時,會進入到 function 裡
(gdb) c                         # 代表 continue,一直執行到結束,但如果遇到中斷點會停下
(gdb) p <var>                   # print 出一個變數的值
  1. gdb 的設定檔 .gdbinit 以及針對 chibicc 的設定
    ./chibicc 這個資料夾下,建立一個 .gdbinit 的檔案,如此一來在執行 gdb 時就會自動的載入設定檔了
# .gdbinit
tui enable                  # 使用 tui mode
set follow-fork-mode child  # 當 fork() 時,選擇追蹤 child process 而非 parent process 這是為了 chibicc 而做的設定

再執行 gdb --args ./chibicc -c foo.c 之後,會發現會出現像這樣的錯誤:

...
To enable execution of this file add
        add-auto-load-safe-path /home/username/chibicc/.gdbinit
line to your configuration file "/home/username/.gdbinit".
...

照著上面說的做就好,在 /home/username/.gdbinit 這個檔案中加入一行 add-auto-load-safe-path /home/username/chibicc/.gdbinit 就可以了


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言